"""
@Project ：zzzr_api_test 
@File    ：parameter_setting.py
@IDE     ：PyCharm 
@Author  ：ZSR
@Date    ：2023/2/23 23:19 
"""

from jsonpath import jsonpath
from tool.log import logger
from tool.function import random_str, random_number, random_time


class ParameterSetting:
    # 参数存放和提取

    # 方法测试时测试数据
    access_value = {'id': 1, 'b': 213, 'g': 21, 'username': 'zsrzsrzsr', 'errorCode': 0}

    # access_value = {}

    @classmethod
    def data_is_replace(cls, data: dict):
        """
        判断数据需不需要替换，data有可能是空，因为一些接口不需要请求参数，或者不需要提取接口返回值

        :param data: 请求参数data和提取参数extract_key
        :return: 返回参数是否需要被替换
        """
        if data is None:
            return False
        for k, v in data.items():
            if '$.' in str(v):
                return True
            if 'random' in str(v):
                return True
        return False

    @classmethod
    def parameter_setting(cls, data: dict, operation='get'):
        """
        :param data:  返回结果提取和参数依赖使用dict 例：{'bill': '$.bill'}
        :param operation: save 把数据存到参数池里面无返回，get读取参数池数据并返回新值
        :return:
        """
        if operation == 'save':
            # {'a':44,'a1':144} 键 + 明确的值
            logger.info(f'参数提取前的参数池：{cls.access_value}')
            for k, v in data.items():
                # 把data的键值添加到参数池里面
                cls.access_value[k] = v
            logger.info(f'参数提取后的参数池：{cls.access_value}')

        if operation == 'get':
            # data={'b': '$.b','g':'$.g'} 提取格式键+提取表达式,这里处理参数提取
            for k, v in data.items():
                if '$.' in str(v):
                    if not jsonpath(cls.access_value, v):
                        logger.error(f'依赖参数出现问题，依赖表达式{v}，参数池{cls.access_value}')
                        return {'错误信息': '未读取到参数'}
                    logger.info(f'读取前的参数池{cls.access_value}')
                    v = jsonpath(cls.access_value, v)[0]
                    data[k] = v
            # data = {"time": random_time(), "str": random_str(6), "int": random_number(5)}
            # ，这里处理函数(随机字符，随机数)
            for k, v in data.items():
                if 'random' in str(v):
                    data[k] = eval(v)

            logger.info(f'替换后的参数{data}')
            return data

    @classmethod
    def extract_value(cls, api_response: dict, extract_key: dict):
        """
        :param api_response: 响应体
        :param extract_key: {'billCommonNo': '$.content.billCommonNo'} 提取参数字典
        :return: 返回通过表达式提取出接口的最终要存的值
        """
        extract_value = {}
        logger.info(f'提取前的响应体{api_response}')
        for k, v in extract_key.items():
            # 把表达式通过接口返回的数据变成值，通过字典添加到extract_value里面返回
            try:
                extract_value[k] = jsonpath(api_response, v)[0]
            except TypeError:
                logger.error(f'提取失败！请检查提取表达式')
        return extract_value


if __name__ == '__main__':
    # 测试参数存储
    # ParameterSetting.parameter_setting({'a': 44, 'a1': 144, 'b': 1, 'g': 'wbg'}, 'save')
    # 测试参数读取
    setting = ParameterSetting.parameter_setting({'k': 'random_str(8)'})
    print(setting)

    # # 测试提取参数字典转换为值
    # print(ParameterSetting.extract_value(
    #     {'data': [{'desc': '我们支持订阅啦~', 'id': 30,
    #                'imagePath': 'https://www.wanandroid.com/blogimgs/42da12d8-de56-4439-b40c-eab66c227a4b.png',
    #                'isVisible': 1, 'order': 2, 'title': '我们支持订阅啦~', 'type': 0,
    #                'url': 'https://www.wanandroid.com/blog/show/3352'}, {'desc': '', 'id': 6,
    #                                                                      'imagePath': 'https://www.wanandroid.com/blogimgs/62c1bd68-b5f3-4a3c-a649-7ca8c7dfabe6.png',
    #                                                                      'isVisible': 1, 'order': 1,
    #                                                                      'title': '我们新增了一个常用导航Tab~', 'type': 1,
    #                                                                      'url': 'https://www.wanandroid.com/navi'},
    #               {'desc': '一起来做个App吧', 'id': 10,
    #                'imagePath': 'https://www.wanandroid.com/blogimgs/50c115c2-cf6c-4802-aa7b-a4334de444cd.png',
    #                'isVisible': 1, 'order': 1, 'title': '一起来做个App吧', 'type': 1,
    #                'url': 'https://www.wanandroid.com/blog/show/2'}], 'errorCode': 0, 'errorMsg': ''}
    #     , {'id': '$.errorCode', 'errorMsg': '$.errorMsg'}))
